package com.easy.frame.base.service.page;

import com.easy.frame.base.api.pojo.PageDTO;
import com.easy.frame.base.api.pojo.PageVO;

import java.util.List;
import java.util.function.Function;

/**
 * 分页处理类
 *
 * @author zzf
 * @date 2020/7/3 9:56
 */
public class PageProxy {

    /**
     * 当前线程共享对象，用于分页拦截器获取参数并返回
     */
    public static final ThreadLocal<PageVO<?>> LOCAL_PAGE = new ThreadLocal<>();

    /**
     * 分页方法增强，获取分页信息
     *
     * @param selectForPage BaseMapper的查询Page方法
     * @param pageDTO       分页接口参数对象
     * @param <P>           分页接口筛选参数对象
     * @param <R>           分页接口返回对象
     */
    public static <P, R> PageVO<R> proxy(Function<P, List<R>> selectForPage, PageDTO<P> pageDTO) {
        PageVO<R> pageVO = new PageVO<>(pageDTO);
        LOCAL_PAGE.set(pageVO);

        pageVO.setRecords(selectForPage.apply(pageDTO.getParam()));

        copyProperties(LOCAL_PAGE.get(), pageVO);
        return pageVO;
    }

    private static void copyProperties(PageVO<?> localPage, PageVO<?> resultPage) {
        resultPage.setTotal(localPage.getTotal());
        resultPage.setPages(localPage.getPages());
        //必须手动删除缓存，防止内存泄露
        LOCAL_PAGE.remove();
    }
}
